﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataTypes;

namespace Persistencia
{
    public class PersistenciaBoletas
    {
        public void AltaBoleta(DataBoleta dataBoleta)
        {
            DateTime fecJorn = dataBoleta.FecJornal;
            int hsTrab = dataBoleta.HsTrabajadas;
            int kmE = dataBoleta.KmEntrada;
            int kmS = dataBoleta.KmSalida;
            float imp = dataBoleta.Importe;
            bool ticket = dataBoleta.EsDepositoBancario;
            string Obs = dataBoleta.Observaciones;
            string estado = dataBoleta.Estado;
            string ced = dataBoleta.CedulaEmpleado;
            String matr = dataBoleta.Matricula;
            List<DataGasto> lstGastos = dataBoleta.ObtenerGastos();

            float importeGasto = 0;
            if (lstGastos != null)
            {
                foreach (DataGasto gasto in lstGastos)
                {
                    importeGasto = importeGasto + gasto.Monto;
                }
            }

            // obtengo el idEmpleado a partir de la cedula
            PersistenciaEmpleados empleado = new PersistenciaEmpleados();
            int idEmpleado = empleado.obtenerIdEmpleado(ced);
            // obtengo el idCoche a partir de su matricula
            PersistenciaCoches coche = new PersistenciaCoches();
            int idCoche = coche.obtenerIdCoche(matr);
            int _ticket = 1;
            if (!ticket)
                _ticket = 0;

            String consulta = "INSERT INTO Boletas (fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, importeGasto, observaciones, ticket, idEmpleado, idCoche, estado) VALUES ('"+ fecJorn + "', " + hsTrab + ", " + kmE + ", " + kmS + ", " + imp + "," + importeGasto + ",'" + Obs + "'," + _ticket + "," + idEmpleado + "," + idCoche + ",'" + estado + "');";

            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);

            PersistenciaGastos persistirGastos = new PersistenciaGastos();
            if (lstGastos != null)
            {
                AsignarGastosABoletas(lstGastos, ObtenerIdUltimaBoleta());
            }

        }


        public List<DataBoleta> ListarBoletas()
        {
            List<DataBoleta> listaBoletas = new List<DataBoleta>();
            string consulta = "SELECT idBoleta, fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, importeGasto, observaciones, ticket, idEmpleado, idCoche, estado FROM Boletas;";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                int idBoleta = Convert.ToInt32(objReader["idBoleta"]);
                DateTime fechaJornal = Convert.ToDateTime(objReader["fechaJornal"]);
                int horasTrabajadas = Convert.ToInt32(objReader["horasTrabajadas"]);
                int kmsEntrada = Convert.ToInt32(objReader["kmsEntrada"]);
                int kmsSalida = Convert.ToInt32(objReader["kmsSalida"]);
                float importe = (float)Convert.ToDecimal(objReader["importe"]);
                float importeGasto = (float)Convert.ToDecimal(objReader["importeGasto"]);
                string observaciones = Convert.ToString(objReader["observaciones"]);
                int iticket = Convert.ToInt32(objReader["ticket"]);
                bool ticket = iticket == 1;
                int idEmpleado = Convert.ToInt32(objReader["idEmpleado"]);
                int idCoche = Convert.ToInt32(objReader["idCoche"]);
                string estado = Convert.ToString(objReader["estado"]);                
                string cedula = obtenerCedulaEmpleado(idEmpleado);
                string matricula = obtenerMatricula(idCoche);
                List<DataGasto> listaGastos = ListarGastos(idBoleta);               
                //List<DataGasto> listaGastos = null;
                DataBoleta boleta = new DataBoleta(idBoleta, fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, ticket, observaciones, estado, listaGastos, cedula, matricula);

                listaBoletas.Add(boleta);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return listaBoletas;
        }

        public void ModificarBoleta(DataBoleta dataBoleta, int idBoleta)
        {
            DateTime fecJorn = dataBoleta.FecJornal;
            int hsTrab = dataBoleta.HsTrabajadas; 
            int kmE = dataBoleta.KmEntrada;
            int kmS = dataBoleta.KmSalida;
            float imp = dataBoleta.Importe;
            bool ticket = dataBoleta.EsDepositoBancario;
            int _ticket = 0;
            if (ticket)
                _ticket = 1;
            string Obs = dataBoleta.Observaciones;
            string estado = dataBoleta.Estado;
            string ced = dataBoleta.CedulaEmpleado;
            String matr = dataBoleta.Matricula;
            List<DataGasto> lstGastos = dataBoleta.ObtenerGastos();
            float importeGasto = 0;
            PersistenciaGastos persistirGastos = new PersistenciaGastos();
            if (lstGastos != null)
            {            
                foreach (DataGasto gasto in lstGastos)
                {
                   importeGasto = importeGasto + gasto.Monto;
                }
            }
           
            
            // obtengo el idEmpleado a partir de la cedula
            PersistenciaEmpleados empleado = new PersistenciaEmpleados();
            int idEmpleado = empleado.obtenerIdEmpleado(ced);
            // obtengo el idCoche a partir de su matricula
            PersistenciaCoches coche = new PersistenciaCoches();
            int idCoche = coche.obtenerIdCoche(matr);

            string consulta = "update Boletas set fechaJornal = " + fecJorn.ToString("yyyy-MM-dd") + ",horasTrabajadas = " + hsTrab + ", kmsEntrada = " + kmE + ", kmsSalida = " + kmS + ", importe = " + imp + ", observaciones = '" + Obs + "', ticket = " + _ticket + ", idEmpleado = " + idEmpleado + ", idCoche = " + idCoche + " where idBoleta = " + idBoleta;
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);
            
            // sustituyo los gastos viejos por los nuevos           
            EliminarGastosBoletas(idBoleta);

            if (lstGastos != null)
            {
                AsignarGastosABoletas(lstGastos, ObtenerIdUltimaBoleta());
            }
        }

        public void ModificarEstadoBoleta(int idBoleta, string estado)
        {
            string consulta = "update Boletas set estado = '" + estado + "' where idBoleta = " + idBoleta + ";";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);
            
        }

        public List<DataBoleta> ListarBoletasDesdeHasta(DateTime desdeAux, DateTime hastaAux)
        {
            DateTime desde = new DateTime(desdeAux.Year, desdeAux.Month, desdeAux.Day);
            DateTime hasta = new DateTime(hastaAux.Year, hastaAux.Month, hastaAux.Day);

            List<DataBoleta> listaBoletas = new List<DataBoleta>();
            //string consulta = "SELECT idBoleta, fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, importeGasto, observaciones, ticket, idEmpleado, idCoche, estado FROM Boletas WHERE fechaJornal between '" + desde.Year + "-" + desde.Day + "-" + desde.Month + " 00:00:00.000' AND '" + hasta.Year + "-" + hasta.Day + "-" + hasta.Month + " 00:00:00.000';";
            string consulta = "SELECT idBoleta, fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, importeGasto, observaciones, ticket, idEmpleado, idCoche, estado FROM Boletas WHERE fechaJornal between '" + desde + "' AND '" + hasta + "'";
            //ToString("yyyy-MM-dd")
            
            AccesoBD accesoBD = new AccesoBD();
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            
            while (objReader.Read())
            {
                int idBoleta = Convert.ToInt32(objReader["idBoleta"]);
                DateTime fechaJornal = Convert.ToDateTime(objReader["fechaJornal"]);
                int horasTrabajadas = Convert.ToInt32(objReader["horasTrabajadas"]);
                int kmsEntrada = Convert.ToInt32(objReader["kmsEntrada"]);
                int kmsSalida = Convert.ToInt32(objReader["kmsSalida"]);
                float importe = (float)Convert.ToDecimal(objReader["importe"]);
                float importeGasto = (float)Convert.ToDecimal(objReader["importeGasto"]);
                string observaciones = Convert.ToString(objReader["observaciones"]);
                int iticket = Convert.ToInt32(objReader["ticket"]);
                bool ticket = iticket == 1;
                int idEmpleado = Convert.ToInt32(objReader["idEmpleado"]);
                int idCoche = Convert.ToInt32(objReader["idCoche"]);
                string estado = Convert.ToString(objReader["estado"]);
                string cedula = obtenerCedulaEmpleado(idEmpleado);
                string matricula = obtenerMatricula(idCoche);
                List<DataGasto> listaGastos = ListarGastos(idBoleta);
                DataBoleta boleta = new DataBoleta(idBoleta, fechaJornal, horasTrabajadas, kmsEntrada, kmsSalida, importe, ticket, observaciones, estado, listaGastos, cedula, matricula);

                listaBoletas.Add(boleta);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return listaBoletas;
        }



        /// -- M E T O S   A U X I L I A R E S
        ///  retorna la lista de gastos de la boleta a partir de su id
        public List<DataGasto> ListarGastos(int idBoleta)
        {
            List<DataGasto> listaGastos = new List<DataGasto>();
            string consulta = "select g.nombre as nombre, g.descripcion as descripcion, gb.importe as monto from gastos g, GastosBoletas gb where g.idGasto = gb.idGasto and gb.idBoleta = " + idBoleta + ";";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                string nombre = Convert.ToString(objReader["nombre"]);
                string descripcion = Convert.ToString(objReader["descripcion"]);
                float monto = (float)Convert.ToDecimal(objReader["monto"]);
                DataGasto gasto = new DataGasto(nombre, descripcion);
                gasto.Monto = monto;
                listaGastos.Add(gasto);
            }

            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return listaGastos;
        }

        public string obtenerCedulaEmpleado(int idEmpleado)
        {
            string consulta = "select cedula from Empleados where idEmpleado = " + idEmpleado + ";";
            string cedula = "";
             AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                cedula = Convert.ToString(objReader["cedula"]);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return cedula;
        }

        public string obtenerMatricula(int idCoche)
        {
            string consulta = "select matricula from Coches where idCoche = " + idCoche + ";";
            string matricula = "";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                matricula = Convert.ToString(objReader["matricula"]);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return matricula;
        }

        public void AsignarGastosABoletas(List<DataGasto> lstGastos, int idBoleta)
        {
            if (lstGastos != null)
            {
                foreach (DataGasto gasto in lstGastos)
                {
                    int idGasto = ObtenerIdGasto(gasto);
                    string consulta = "insert into GastosBoletas (idBoleta,idGasto,importe) VALUES (" + idBoleta + "," + idGasto + "," + gasto.Monto + ");";
                    AccesoBD accesoBD = new AccesoBD();
                    //Creo un objeto Command.
                    SqlConnection myConnection = accesoBD.ConectarBD();
                    SqlCommand myCommand = new SqlCommand(consulta, myConnection);
                    //Ejecucion del comando en el servidor de BD
                    myCommand.ExecuteNonQuery();
                    accesoBD.DesconectarBD(myConnection);
                }
            }
        }

        public int ObtenerIdGasto(DataGasto gasto)
        {
            int idGasto = 0;
            // obtengo el id de cada gasto
            string nombre = gasto.Nombre;
            string descripcion = gasto.Descripcion;
            string consulta = "select idGasto from Gastos where nombre = '" + nombre + "';";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                idGasto = Convert.ToInt32(objReader["idGasto"]);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return idGasto;
        }

        public int ObtenerIdUltimaBoleta()
        {
            int idBoleta = 0;
            string consulta = "select max(idBoleta) as id from boletas;";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                idBoleta = Convert.ToInt32(objReader["id"]);
            }
            objReader.Close();  
            accesoBD.DesconectarBD(myConnection);
            return idBoleta;
        }

        public void EliminarGastosBoletas(int idBoleta)
        {
            string consulta = "delete from GastosBoletas where idBoleta = " + idBoleta + ";";
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);       
        }
    }
}
